package ar.com.gals.repository;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Restrictions;

import ar.com.gals.domain.Indice;
import ar.com.gals.domain.Marca;
import ar.com.gals.domain.Rubro;
import ar.com.gals.domain.Usuario;


public class IndiceRepository extends AbstractRepository<Indice> {

	public IndiceRepository(Session session) {
		super(session, Indice.class);
	}

	
	@SuppressWarnings("unchecked")
	public List<Indice> getAll(Usuario usuario) {

		Criteria criteria = this.session.createCriteria(domain);
		
		Criteria criteriaUsuario = criteria.createCriteria("usuario");
		criteriaUsuario.add(Restrictions.idEq(usuario.getId()));
				
		criteria.add(Restrictions.isNull("fechaDelete"));
		criteria.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
		
		List<Indice> indices = (List<Indice>) criteria.list();
		List<Indice> indicesNuevos = new ArrayList<Indice>();
		
		/**************  COMBINO MARCA / RUBRO NUEVOS **********/
		
		@SuppressWarnings("rawtypes")
		List<Marca> marcas = (List<Marca>) new AbstractRepository(this.session, Marca.class).getAll();
		
		for(Marca marca : marcas) {
			
			Hibernate.initialize(marca.getRubros());
			
			for(Rubro rubro : marca.getRubros()) {
				
				boolean existe = false;
				
				for(Indice indice : indices) {
					
					if(indice.getMarca().getId() == marca.getId() && indice.getRubro().getId() == rubro.getId()) {						
						existe = true;
						break;
					}
				}
				if(!existe) {
					Indice indice = new Indice();
					indice.setUsuario(usuario);
					indice.setMarca(marca);
					indice.setRubro(rubro);
					indice.setMargen(new Float(0));
					indice.setDescuento(new Float(0));
					indicesNuevos.add(indice);
				}
			}
		}
		
		indices.addAll(indicesNuevos);
		
		Collections.sort(indices, new Comparator<Indice>() {
	        @Override
	        public int compare(Indice indice1, Indice indice2)
	        {
	        	return (indice1.getMarca().getNombre()+indice1.getRubro().getNombre()).compareTo(
	        				indice2.getMarca().getNombre()+indice2.getRubro().getNombre()
	        			);
	        }
	    });
		
		return indices;
	}
}
